package com.zsh.boot.config;

import ch.qos.logback.core.db.DBHelper;
import com.zsh.boot.bean.Car;
import com.zsh.boot.bean.Pet;
import com.zsh.boot.bean.User;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

/**
 * @author zsh
 * @Description 1.配置类里面可以使用@Bean标注在方法上给容器注册组件，默认也是单实例
 *              2.配置类本身也是组件
 *              3.proxyBeanMethods :是不是代理bean的方法
 *                  Full全配置  proxyBeanMethods = true 启动的时候将所有的组件创建完放入容器
 *                  Lite 轻量级配置 proxyBeanMethods = false 直接创建一个新的组件返回
 *                  组件依赖问题
 *                  无组件依赖使用false
 *                  有依赖使用true
 *
 *              4.@Import({User.class, DBHelper.class}
 *                  给容器中自动创建组件,默认组件的名字就是全类名、
 *              5.@ImportResource("classpath:beans.xml") 导入xml配置文件
 *
 * @create 2022-02-18 11:35
 */

@Import({User.class, DBHelper.class}) //数组，导入组件
@Configuration(proxyBeanMethods = true) //注解配置类 == 配置文件.xml
//@ConditionalOnBean(name = "cat")
@ConditionalOnMissingBean(name = "cat")
@ImportResource("classpath:beans.xml")
@EnableConfigurationProperties(Car.class)
//1.开启属性配置功能
//2.把组件 Car 自动注册到容器中
public class MyConfig {


    /**
     * 外部无论对配置类中的组件注册方法调用多少次，获取的都是之前注册到容器中的单实例对象
     * @return
     */
    @Bean //给容器中添加组件，以方法名作为组件的id，返回类型是组件类型，返回的对象就是组件在容器中保存的对象
    public User user01(){
        User zsh = new User("zsh", 18);
        //true 时 user组件依赖与pet组件
        zsh.setPet(cat());
        return zsh;
    }

    @Bean
    public Pet cat(){
        return new Pet("tom");
    }
}
